

#include  "usart.h"
#include <stdio.h>
#include <stdarg.h>//sprintf的家


uint8_t usart_Rxflag;


void usart_init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//TX输出引脚复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//RX上拉输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//TX输出引脚复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//RX上拉输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);
	//RX输入引脚//浮空或上拉//串口通信空闲状态高电平不能下拉
	
	
	USART_InitTypeDef a;
	a.USART_BaudRate=9600;//波特率//自动算好DIV=72M/9600/16
	a.USART_WordLength=USART_WordLength_8b;//字长8位
	a.USART_StopBits=USART_StopBits_1;//1位停止位
	a.USART_Parity=USART_Parity_No;//不校验
	a.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//发送模式
	a.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//不使用硬件流控
	USART_Init(USART1,&a);
	USART_Init(USART3,&a);
	
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启RXNE标志位到NVIC的输出
	USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//开启RXNE标志位到NVIC的输出

	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	
	
	
	
	NVIC_InitTypeDef b;
	b.NVIC_IRQChannel=USART1_IRQn;
	b.NVIC_IRQChannelCmd=ENABLE;
	b.NVIC_IRQChannelPreemptionPriority=5;//抢占优先级
	b.NVIC_IRQChannelSubPriority=0;//
	NVIC_Init(&b);
	b.NVIC_IRQChannel=USART3_IRQn;//
	b.NVIC_IRQChannelCmd=ENABLE;
	b.NVIC_IRQChannelPreemptionPriority=5;//抢占优先级
	b.NVIC_IRQChannelSubPriority=0;//
	NVIC_Init(&b);
	
	USART_Cmd(USART1,ENABLE);//串口使能
	USART_Cmd(USART3,ENABLE);//串口使能
}

void  usart_sendbit(uint8_t  byte)
{
		USART_SendData(USART1,byte);
	//先给DATA再把无关变量高位清零，赋值给DR寄存器，写入DR，数据最终通向TDR，
	//再给发送移位寄存器，最后一位一位的把数据移出TX引脚完成数据发送
	while  (USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
	//等待TEX（发送寄存器空标志位）置一
	//下一次发送数据时自动清零
	
}
void  usart_master_sendbit(uint8_t  byte)
{
		USART_SendData(USART3,byte);
	//先给DATA再把无关变量高位清零，赋值给DR寄存器，写入DR，数据最终通向TDR，
	//再给发送移位寄存器，最后一位一位的把数据移出TX引脚完成数据发送
	while  (USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
	//等待TEX（发送寄存器空标志位）置一
	//下一次发送数据时自动清零
}

void usart_senda(uint8_t *a,uint16_t l)//指针类型指向待发送数组的首地址//数组无法判断是否结束需要传递一个l进来
{
	uint16_t i;
	for(i=0;i<l;i++)
	{
		usart_sendbit(a[i]);//依次取出数组的每一项
		
		
	}
	
}

void usart_sendstring(char *string)
{
	uint16_t i;
	for(i=0;string[i]!='\0';i++)//空字符的转义字符位\0
	{
		usart_sendbit(string[i]);//依次取出数组的每一项	
	}
}

void usart_send_master(char *string)
{
	uint16_t i;
	for(i=0;string[i]!='\0';i++)//空字符的转义字符位\0
	{
		USART_SendData(USART3,string[i]);
		//先给DATA再把无关变量高位清零，赋值给DR寄存器，写入DR，数据最终通向TDR，
		//再给发送移位寄存器，最后一位一位的把数据移出TX引脚完成数据发送
		while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
		//等待TEX（发送寄存器空标志位）置一
		//下一次发送数据时自动清零
	}
}

uint32_t usart_pow(uint32_t X, uint32_t Y)
{
	uint32_t R=1;
	while(Y--)
	{
		R=R*X;
	}
	return R;
	
}



void usart_sendnum(uint32_t n,uint8_t l)
{
	uint16_t i;
	for(i=0;i<l;i++)//空字符的转义字符位\0
	{
		usart_sendbit(n/usart_pow(10,l-i-1)%10+'0');//十进制从高位到底位依次传递//	
	}
}

int fputc(int ch,FILE *f)//fputc函数的原型
{
	usart_sendbit(ch);//重定向fputc到串口
//	usart_master_sendbit(ch);
	return ch;//printf打印时不断调用fputc函数打印
	
	
}



//对sprintf进行封装（printf可变参数）
void usart_printf(char *f,...)//f用来接受格式化字符串//...用来接受可变参数列表
{
	char string[100];
	va_list arg;//定义一个列表参数变量//va_list是类型名//arg为变量
	va_start(arg,f);//从f位置开始接受参数表，放在arg中
	vsprintf(string,f,arg);//打印位置是string//格式化字符串是f//参数表是arg//
	//sprintf只能接受直接写的参数//对于此类封装格式要用vsprintf
	va_end(arg);//释放参数表
	usart_sendstring(string);//发送string
	
}
uint8_t usart_getRxflag(void)//实现读后自动清除
{
	if(usart_Rxflag==1)
	{
		usart_Rxflag=0;
		return 1;
	}
	return 0;
	
}


uint8_t usart_getRxdata(void)
{
	return 1;
}

void usart_connect(char * source,char *now,u8 size)
{
	u8 i;

	now[0]='@';
	for(i=0;i<=size;i++)
	{
		now[1+i]=*source;
		source++;
		
	}
	now[size+1]=' ';
	now[size+2]='.';
}

void  usart_123ascll(u8 a[],char b[])
{

		b[0]=a[0]/10+48;
		b[1]=a[0]%10+48;
		b[2]=a[1]%10+48;

		b[3]=a[2]/10+48;
		b[4]=a[2]%10+48;
		b[5]=a[3]%10+48;


}
void  PRE_SLEEP_PROCESSING(void )
{

//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,DISABLE);
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,DISABLE);
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,DISABLE);
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,DISABLE);
//	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,DISABLE);
//	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,DISABLE);	
//	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,DISABLE);
//	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,DISABLE);
}

//退出低功耗恢复的时钟
void 	POST_SLEEP_PROCESSING(void )
{
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
//	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);	
//	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
//	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
}






